#include "file_operations.h"

bool addSetup( Task *task )
{
	return true;
}

/*
	Gemaakt door: Gerco Koks
	gebruikt algoritme: p(x,y) = souce(x,y) + result(x,y)
*/
bool add( Image &imgSource, Image &imgResult, void *data )
{
	unsigned int row, col, chan;
	
	// grote van SourceImage bepalen
	int sizeSourceImage = ( imgSource.width() * imgSource.height() );
	// grote van ResultImage bepalen
	int sizeResultImage = ( imgResult.width() * imgResult.height() );
	
	// source groter dan result image?
	if( sizeSourceImage > sizeResultImage )
	{
		// zo ja, een dialoog tonen
		showErrorMessage();
		// einde operatie
		return false;
	}

	// loop door de rijen
	for( row = 0; row < imgSource.height(); row++ )
		// loop door de kolommen	
		for( col = 0; col < imgSource.width(); col++ )
			// loop door de channels		
			for( chan = 0; chan < 3; chan++ )
			{ 
				// het algoritme
				double result = 
					imgSource[row][col][chan] + imgResult[row][col][chan];
				
				//niet groter dan 255 en kleiner dan 0
				result = (result > 255) ? result = 255 : ( result < 0 ) ? result = 0 : result;
				// sla pixel op
				imgResult[row][col][chan] = (byte)result;
			}
	// en klaar is kees
	return true;
}

bool multiplySetup( Task *task )
{
	return true;
}

/*
	Gemaakt door: Gerco Koks
	gebruikt algoritme: p(x,y) = souce(x,y) * result(x,y)
*/
bool multiply( Image &imgSource, Image &imgResult, void *data )
{
	unsigned int row, col, chan;
	// grote van SourceImage bepalen
	int sizeSourceImage = ( imgSource.width() * imgSource.height() );
	// grote van ResultImage bepalen
	int sizeResultImage = ( imgResult.width() * imgResult.height() );
	
	// source groter dan result image?
	if( sizeSourceImage > sizeResultImage )
	{
		// zo ja, een dialoog tonen
		showErrorMessage();
		// einde operatie
		return false;
	}

	// loop door de rijen
	for( row = 0; row < imgSource.height(); row++ )
		// loop door de kolommen	
		for( col = 0; col < imgSource.width(); col++ )
			// loop door de channels		
			for( chan = 0; chan < 3; chan++ )
			{ 
				// het algoritme
				double result = 
					 imgSource[row][col][chan] * imgResult[row][col][chan];
				
				// niet groter dan 255 en niet kleinder dan 0
				result = (result > 255) ? result = 255 : ( result < 0 ) ? result = 0 : result;
				// sla pixel op
				imgResult[row][col][chan] = (byte)result;
			}
	// en klaar is kees	
	return true;
}

bool subtractSetup( Task *task )
{
	return true;
}

/*
	Gemaakt door: Gerco Koks
	gebruikt algoritme: p(x,y) = result(x,y) - source(x,y)
*/
bool subtract( Image &imgSource, Image &imgResult, void *data )
{
	unsigned int row, col, chan;
	// grote van SourceImage bepalen
	int sizeSourceImage = ( imgSource.width() * imgSource.height() );
	// grote van ResultImage bepalen
	int sizeResultImage = ( imgResult.width() * imgResult.height() );
	
	// source groter dan result image?
	if( sizeSourceImage > sizeResultImage )
	{
		// zo ja, een dialoog tonen
		showErrorMessage();
		// einde operatie
		return false;
	}

	// loop door de rijen
	for( row = 0; row < imgSource.height(); row++ )
		// loop door de kolommen	
		for( col = 0; col < imgSource.width(); col++ )
			// loop door de channels		
			for( chan = 0; chan < 3; chan++ )
			{ 
				// het algoritme
				double result = 
					imgResult[row][col][chan] - imgSource[row][col][chan];
				
				// niet groter dan 255 en niet kleinder dan 0
				result = (result > 255) ? 255 : ( result < 0 ) ? 0 : result;
				// sla pixel op
				imgResult[row][col][chan] = (byte)result;
			}
	// en klaar is kees	
	return true;
}

/*
	Gemaakt door: Gerco Koks
	toont een messagebox waneer deze methode wordt aangeroepen.
	Dit ter informatie voor de gebruiker
*/
void showErrorMessage()
{
	LPCWSTR message = L"De toe te voegen afbeelding mag niet groter zijn dan het doelplaatje. \n De operatie wordt gestaakt"; 
	LPCWSTR caption = L"Waarschuwing";
	MessageBox(NULL, message, caption, MB_ICONSTOP | MB_OK );
}
